package sucursal;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Nelly
 */
public class Nodo extends Thread {
    
    private int tipo;
    private static final int SRV_MENSAJE = 1;
    private static final int SRV_ADD_NODO = 2;      
    //private int[] args;
    private int portEscucha;
    private String nodo;
    private int portSiguiente;

    public void setNodo(String nodo) {
        this.nodo = nodo;
    }        

    public void setPortSiguiente(int portSiguiente) {
        this.portSiguiente = portSiguiente;
    }

    public void setPortEscucha(int portEscucha) {
        this.portEscucha = portEscucha;
    }

    public Nodo (int tipo){                
        this.tipo = tipo;
    }
    
    @Override
    public void run(){
        while(true){
            if (this.tipo == SRV_MENSAJE){
                this.esperarMensaje();
            }
            else if (this.tipo == SRV_ADD_NODO)
                System.out.println("wao");
                //this.agregarNodo(tipo, tipo);
            }
    }

  

    private void esperarMensaje() {
     try {
            // TODO code application logic here
            ServerSocket servicio = new ServerSocket(this.portEscucha); //Puerto de escucha, donde llegan las peticiones
            Socket socketServicio = null;            
            System.out.println("Estoy escuchando para mensajes  soy nodo nº "+this.nodo);
            //esperamos conexion
            boolean prueba = true;
            while(prueba) {          
            socketServicio = servicio.accept(); //acepta la peticion        

            //Inicializa variables de recepcion y emision del msj
            PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
            BufferedReader entrada = new BufferedReader(new InputStreamReader(socketServicio.getInputStream()));
            //Object
            String mensaje = entrada.readLine();

          
            try {

                int port = Integer.parseInt(mensaje);
                this.setPortSiguiente(port);
                System.out.println("cambie puerto");
                mensaje = "recibido";

            }
            catch (NumberFormatException e )
            {
                   
            }
            
            salida.close();
            entrada.close();
            socketServicio.close();
            System.out.println("tengo el mensaje: " + mensaje + " soy nodo: " + this.nodo+"Puerto: "+this.portSiguiente+" Puerto Escucha "+this.portEscucha);
            this.sleep(3000);

            if(!mensaje.equals("recibido"))
            this.enviarMensaje(mensaje);
            
            }            
            servicio.close();
     }catch (IOException ex) {
            System.out.println("Algo se daño:");
            ex.printStackTrace();
     }
     catch(InterruptedException esleep){
         esleep.printStackTrace();
     }
    }


    public void agregarNodo(int puerto, String puertoCambio)
    {
        try {
            // TODO code application logic here
            Socket nodoSiguiente = new Socket("localhost", puerto); //Puerto por donde enviara el msj
            PrintWriter salida = new PrintWriter(nodoSiguiente.getOutputStream(), true);
            System.out.println("escribo bonito "+puertoCambio+" mi puerto es "+puerto+" port sig "+this.portSiguiente );
            salida.write(puertoCambio); //aca hay un peo
            salida.close();
            nodoSiguiente.close();
        } catch (IOException ex) {
            System.out.println("Problema al enviar msj");
            ex.printStackTrace();
        }

        esperarMensaje();

    }

    public void enviarMensaje(String mensaje){
        try {
            // TODO code application logic here
            Socket nodoSiguiente = new Socket("localhost", this.portSiguiente); //Puerto por donde enviara el msj
            PrintWriter salida = new PrintWriter(nodoSiguiente.getOutputStream(), true);
            salida.write(mensaje);
            salida.close();
            nodoSiguiente.close();   
        } catch (IOException ex) {
            System.out.println("Problema al enviar msj");
            ex.printStackTrace();
        }
    }

}
